package AudioUDP.Receiver;
import java.net.*;
import java.io.*;
import java.util.*;

	public class Receiver extends Thread{ 
	    // on utilise des port >1024 pour ne pas avoir de pb de droits
		static int PORT_SERVEUR = 2510;
	    static int TAILLE_MAX_BUFFER=640;	    
	    boolean isrunning = false;
	    Player monPlayer = new Player();
	    //taille de 640 000 (peut recevoir jusqu'a 1000 paquets
	    FIFO FIFOBuff = new FIFO(640000);
	    
	    //buffer qui contiendra les données recues
	    
	    
	    public void start(){
			// le buffer in est dimentionnés à la taille du plus grand message 
			// du protocole,
		      
			byte[] bufferin = new byte[TAILLE_MAX_BUFFER];
			int compteur = 0;
			String reponse;
			DatagramSocket datagramSocket = null;
			DatagramPacket inPacket = null;
			DatagramPacket outPacket = null;
			InetAddress addr = null;
			ArrayList<byte[]> mesBuffer = new ArrayList();
			boolean statut = false, UDPSent=false;
			
			//vérifie si le buffer n'est pas trop rempli
			boolean RNOKnotStart=false;
			ReceiverNotOk RNOK = new ReceiverNotOk();
			
			
			try{ 
				// create socket
				datagramSocket = new DatagramSocket(PORT_SERVEUR);
		
				while(true){
					// Le serveur est pret, il attend les clients
					
					System.out.println("Waiting for client requests");
					inPacket = new DatagramPacket(bufferin, bufferin.length);	
					datagramSocket.receive(inPacket);
		
					/*** Récupérer les données du paquet UDP ****/
					//buf.add(compteur, inPacket.getData());
					bufferin = inPacket.getData();
					
					for(int i = 0; i< bufferin.length;i++){
						FIFOBuff.entrer(bufferin[i]);
					}
					
					/*if(RNOKnotStart==false){
						RNOK.datagramSock = datagramSocket;
						RNOK.inPack=inPacket;
						RNOKnotStart=true;
						System.out.println("start");
						RNOK.start();
						System.out.println("RNOK ??");
					}*/
					System.out.println("Paquet reçu, nombre d'éléments FIFO : " + FIFOBuff.getNbelt());
					//compteur++;
					if(isrunning==false & FIFOBuff.getNbelt()>3000){
						monPlayer.start();
						isrunning = true;
						System.out.println("Démarrage du player");
					}
					
					if(FIFOBuff.getNbelt()>300000 & RNOK.UDPSent==false){
						/*** Appel de la fonction qui envoie un paquet UDP ****/
						RNOK.setisOK();
					}
					
					if(FIFOBuff.getNbelt()==0)
						isrunning=false;
					
				    }
			    } catch (Exception e)
				{ System.err.println("Closing DatagramSocket");
				if (datagramSocket != null)
				    datagramSocket.close();
				}
	    }
	

	
	class Player extends Thread{

	    BufferedOutputStream aos;
	    public void start() {
			try{
				String cmd = String.format("play -r 16000 -c 1 -s -2 -t raw -");
				Process play = Runtime.getRuntime().exec(cmd);
				aos = new BufferedOutputStream(play.getOutputStream());

				while(FIFOBuff.getNbelt()>0){
					byte[] buffer = new byte[2];
					buffer[0] = FIFOBuff.sortir();
					buffer[1] = FIFOBuff.sortir();
					aos.write(buffer,0,buffer.length);
					System.out.println("Lecture ?");
				}
			}catch(Exception e){
			    System.out.println(e);
			}
	    }
	    
	}
	}